package org.jgs1904;

import org.apache.shiro.SecurityUtils;
import org.apache.shiro.authc.*;
import org.apache.shiro.config.IniSecurityManagerFactory;
import org.apache.shiro.crypto.hash.Md5Hash;
import org.apache.shiro.crypto.hash.SimpleHash;
import org.apache.shiro.mgt.SecurityManager;
import org.apache.shiro.subject.Subject;
import org.junit.Test;

/**
 * @author: 默苍璃
 * @date: 2025-05-31 13:50
 */
public class ShiroRun {
    public static void main(String[] args) {
        IniSecurityManagerFactory factory = new IniSecurityManagerFactory("classpath:shiro.ini");
        SecurityManager securityManager = factory.getInstance();
        SecurityUtils.setSecurityManager(securityManager);
        Subject subject = SecurityUtils.getSubject();
        // web项目时，用户名和密码是客户端表单传递过来的用户名和密码。
        AuthenticationToken token = new UsernamePasswordToken("zhangsan", "zs");
        try {
            // login()方法没有返回值，只能通过是否有异常判断是否登录成功。
            subject.login(token);
            System.out.println("登录成功");

            // 判断角色
            boolean hasRoleResult = SecurityUtils.getSubject().hasRole("role1");
            System.out.println("result:" + hasRoleResult);

            // 判断权限
            boolean hasPermission = subject.isPermitted("update");
            System.out.println("result:" + hasPermission);
            // 没有返回值 通过异常判断
            SecurityUtils.getSubject().checkPermission("permission1");


        } catch (UnknownAccountException e) {
            System.out.println("账号不存在");
        } catch (IncorrectCredentialsException e) {
            System.out.println("密码错误");
        } catch (AuthenticationException e) {
            e.printStackTrace();
        }
    }


    @Test
    public void test() {

        String password = "shiro";

        // md5加密
        Md5Hash md5Hash = new Md5Hash(password);
        System.out.println(md5Hash.toHex());

        // 带盐的MD5加密。盐就是在原有字符串后面拼接盐形成新的字符串，然后加密。
        Md5Hash md5Hash2 = new Md5Hash(password, "salt");
        System.out.println(md5Hash2);

        // 无论是否加盐都可以很容易的被破解，可以多次迭代加密保证数据安全性。
        // 第三个参数表示迭代加密次数
        Md5Hash md5Hash3 = new Md5Hash(password, "salt", 2);
        System.out.println(md5Hash3);

        // 使用Md5的父类也也实现
        SimpleHash simpleHash = new SimpleHash("md5", password, "salt", 2);
        System.out.println(simpleHash);
    }


}

